/**
 *
 */
package Control;

import Acquaintance.IAMark;
import Acquaintance.IAUser;
import DALFactory.IDALFactory;
import DALFactory.IDataMapper;
import DALFactory.ILogin;
import Entity.EUser;
import java.util.ArrayList;

/**
 * 控制层 用户管理中心 负责用户注册、登录、查询
 *
 * @author kocio
 */
public class CAccountManage {

    private CCache cache;
    private IDALFactory IDALfactory;
    private IDataMapper IdataMapper;
    private ILogin Ilogin;

    /**
     * 无参构造函数
     */
    public CAccountManage() {
        cache = CCache.getCache();
        IDALfactory = cache.getDALFactory();
        IdataMapper = IDALfactory.CreateDataMapper();

    }

    /**
     * 用户登录验证
     *
     * @param userName 用户名
     * @param passWD 密码
     * @return true 表明登录成功 <br> false 表明登录失败<br>
     */
    public boolean login(String userName, String passWD) {
        Ilogin = IDALfactory.Login(userName, passWD);
        return Ilogin.isLogin();
    }

    /**
     * 检查用户是否存在
     *
     * @param userName 用户的用户名
     * @return 用户存在，返回真；用户不存在，返回假
     */
    public boolean checkUserName(String userName) {
        if (!cache.getUserMap().containsKey(userName)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 注册新用户
     *
     * @param UserName 用户名
     * @param Passwd 密码
     * @return true 表明注册成功 <br> false 表明注册失败 <br>
     */
    public boolean registerUser(String userName, String passWD) {
    	if(userName==null&&passWD==null)
    		return false;
        if (this.checkUserName(userName)) {
            EUser user = new EUser();
            user.setUserName(userName);
            user.setPassWD(passWD);
            int uid=IdataMapper.insertUser(user);
            user.setUserID(uid);
            cache.registerUser(user);
            return true;
        } else {
            System.err.println("该用户已存在，请重新输入用户名！");
            return false;
        }
    }

    /**
     * 删除用户
     *
     * @param userName 用户名
     * @param passWD 密码
     * @return true 表明删除成功 <br> false 表明删除失败 <br>
     */
    public boolean removeUser(String userName, String passWD) {
        if (this.checkUserName(userName)) {
            EUser user = (EUser) cache.getUserMap().get(userName);
            if (passWD == null ? user.getPassWD() == null : passWD.equals(user.getPassWD())) {
                cache.removeUser(userName);
                IdataMapper.deleteUser(user);
                return true;
            } else {
                System.err.println("密码不正确，请输入正确的密码！");
                return false;
            }
        } else {
            System.err.println("该用户不存在，请重新输入用户名！");
            return false;
        }
    }

    /**
     * 修改用户密码
     *
     * @param userName 用户名
     * @param passWD 密码
     */
    public void setUserPassWD(String userName, String passWD) {
        EUser user = (EUser) cache.getUserMap().get(userName);
        user.setPassWD(passWD);
        user.setDirty(true);
    }

    /**
     * 设置用户邮箱地址
     *
     * @param userName 用户名
     * @param email 邮箱地址
     */
    public void setUserEmail(String userName, String email) {
        EUser user = (EUser) cache.getUserMap().get(userName);
        user.setEmail(email);
        user.setDirty(true);
    }

    /**
     * 获得User 通过用户名从缓存中获取该用户实体访问接口
     *
     * @param userName 用户名
     * @return 访问接口
     */
    public IAUser getUserByUserName(String userName) {
        return (IAUser) cache.getUserMap().get(userName);
    }

    /**
     * SHA-1加密算法处理器
     *
     * @param s 要加密的字段
     * @return 加密结果密文
     * @throws java.security.NoSuchAlgorithmException
     */
    public static String Security(String s) throws java.security.NoSuchAlgorithmException {
        java.security.MessageDigest alga = java.security.MessageDigest.getInstance("SHA-1");
        alga.update(s.getBytes());
        byte[] digesta = alga.digest();
        return byte2hex(digesta);

    }

    /**
     * 加密结果密文“加盐”处理
     *
     * @param b 密文
     * @return 处理后的密文
     */
    private static String byte2hex(byte[] b) // 二行制转字符串
    {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
            if (n < b.length - 1) {
                hs = hs + ":";
            }
        }
        return hs.toUpperCase();
    }

    /**
     * 往数据库中出入用户浏览记录<br> 这个是采取代理，实际操作类是数据层中的对象<br>
     *
     * @param UID 用户ID
     * @param HID 浏览的房屋ID
     * @return
     */
    public boolean InsertTrace(int UID, int HID) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().InsertCat(UID, HID, "UserSee");
    }

    /**
     *
     * @param UID
     * @param HID
     * @return true 表明操作成功 <br> false 表明操作失败 <br>
     */
    public boolean InsertFavo(int UID, int HID) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().InsertCat(UID, HID, "Favourite");
    }

    /**
     * 获取用户收藏记录
     *
     * @param UID 用户ID
     * @return 收藏的房屋ID集
     */
    public ArrayList<Integer> getUserFavor(int UID) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().getLog(UID, "Favourite");
    }

    /**
     * 获取用户浏览记录
     *
     * @param UID 用户ID
     * @return 用户浏览记录集合
     */
    public ArrayList<Integer> getUserLog(int UID) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().getLog(UID, "UserSee");
    }
   

    /**
     * 插入标记<br> 这个是采取代理，实际操作类是数据层中的对象<br>
     *
     * @param mark 标记接口
     * @return true 表明操作成功 <br> false 表明操作失败 <br>
     */
    public boolean InsertMark(IAMark mark) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().InsertMark(mark);
    }

    /**
     * 获取用户标记
     *
     * @param UID 用户ID
     * @return 用户标记
     */
    public ArrayList<IAMark> getMark(int UID) {
        return CCache.getCache().getDALFactory().CreateDataMapper3().getMark(UID);
    }
}
